package main

import (
	"code.oldboyedu.com/studygo/day04/stsMgr_package/logs"
	"code.oldboyedu.com/studygo/day04/stsMgr_package/student"
	stsmgr "code.oldboyedu.com/studygo/day04/stsMgr_package/studentMgr"
	"fmt"
	log "github.com/sirupsen/logrus"
	"os"
)

func main() {
	logs.InitLevel("logrus_level")
	stsMgr := stsmgr.NewStuMgr("./data/data_file.json") //将存储学生信息的结构体经过构造函数初始化后，开始使用，存储学生信息
	stsMgr.LoadFile()
	for {
		//打印功能
		student.GetInput()
		var choice int
		fmt.Println("输入你的选择")
		log.Info("输入你的选择")
		fmt.Scan(&choice)
		switch choice {
		//查看所有学生信息
		case 1:
			/*
				Viewallsts是构造函数NewStuMgr的一种方法,且这个构造函数NewStuMgr的返回值是stsMgr，因此采用stsMgr.Viewallsts()形式
					来查看保存在这个构造函数中的学生信息
			*/
			//fmt.Println("查看全部学生的信息")
			log.Info("查看全部学生的信息")
			stsMgr.Viewallsts()

			//查看单个学生信息
		case 2:
			/*
					Viewoncests也是学生管理器的构造函数NewStuMgr的一种方法,就是之前讲的方法和接收者的示例。查看单个学生的信息，采用传参的方法
				将学生的id传进去,且这个函数有一个bool类型的返回值,可以通过判断该类型的返回值,确认函数是否执行成功
			*/
			fmt.Println("输入要查询的学生id")
			var stsid int
			fmt.Scan(&stsid)
			log.Info("输入要查询的学生id: ", stsid)
			if exist := stsMgr.Modtify(stsid); exist {
				if ok := stsMgr.Viewoncests(stsid); ok {
					log.Info("查看成功")
					fmt.Println("查看成功~~~")
				}
			} else {
				log.Error("查看失败,学生id不存在")
				fmt.Println("查看失败,学生id不存在~")
			}
			//增加学生信息
		case 3:
			/*
					AddMsgsts函数也是构造函数NewStuMgr的一种方法,增加学生信息,调用输入学生信息的函数getInputMsg,且该函数有一个指针类型的结构体返回值
				返回的就是学生结构体中的信息。执行增加学生信息函数时需要将函数getInputMsg的返回值传递进去,并将最后的信息结果保存到构造函数的
				返回值allSts: make([]map[string]*Students, 1024)中,这个也就是等价于在全局变量定义的一个key为string类型,值为*Student类型的切片
			*/
			log.Info("增加学生信息")
			var stsid int
			fmt.Println("请输入新学生id")
			fmt.Scan(&stsid)
			log.Info("输入新学生的id: ", stsid)
			if exist := stsMgr.Modtify(stsid); !exist {
				if ok := stsMgr.AddMsgsts(student.GetInputMsg()); ok {
					log.Info("增加成功")
					fmt.Println("增加成功~~~")
				}
			} else {
				log.Error("增加失败,id已存在")
				fmt.Println("增加失败,id已存在~")
			}
			//修改学生信息
		case 4:
			/*
						UpdateMsgsts函数也是构造函数NewStuMgr的一种方法,修改学生的信息,通过传参的方法将想要修改学生信息的id先传递给判断id是否存在的函数，
				如果存在返回true，在执行更新函数,同时也将输入信息的函数getInputMsg
			*/
			fmt.Println("输入要修改的学生id")
			var stsid int
			fmt.Scan(&stsid)
			log.Info("输入要修改的学生id: ", stsid)
			if exist := stsMgr.Modtify(stsid); exist {
				if ok := stsMgr.UpdateMsgsts(stsid, student.GetInputMsg()); ok {
					log.Info("修改成功")
					fmt.Println("修改成功~~~")
				}
			} else {
				log.Error("修改失败,id不存在")
				fmt.Println("修改失败,id不存在~")
			}
			//删除学生信息
		case 5:
			/*
					DelMsgsts函数也是构造函数NewStuMgr的一种方法,删除学生信息,通过传参的方法将想要修改学生信息的id先传递给判断id是否存在的函数，
				如果存在返回true，在执行删除函数
			*/
			fmt.Println("输入要删除的学生id")
			var stsid int
			fmt.Scan(&stsid)
			log.Info("输入要删除的学生id: ", stsid)
			if exist := stsMgr.Modtify(stsid); exist {
				if ok := stsMgr.DelMsgsts(stsid); ok {
					log.Info("删除成功")
					fmt.Println("删除成功~~~")
				}
			} else {
				log.Error("id不存在")
				fmt.Println("删除失败,id不存在~")
			}
		case 6:
			log.Info("退出系统")
			os.Exit(10002)
		default:
			log.Error("输入有误!!!")
			break
		}
	}
}
